﻿using AntdUI; // UI库 https://gitee.com/AntdUI/AntdUI
using AutoScaleHelper; // 自动缩放库
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Globalization;
using System.IO;
using System.Linq;
using System.Reflection;
using System.Resources;
using System.Runtime.InteropServices;
using System.Security.Cryptography;
using System.Text;
using System.Threading;
using System.Threading.Tasks;
using System.Windows.Forms;
using static MMD_Morph_NoteHelp.MainForm;

namespace MMD_Morph_NoteHelp
{
    // ================= 
    //      设置窗口
    // =================
    public partial class OptionWin : AntdUI.Window
    {
        private MainForm mainForm; // 主窗体引用
        private IniHelper ini = new IniHelper("config\\settings.ini");  // 配置文件实例
        private bool _isDark; // 主题状态

        // 语言资源文件
        private ResourceManager resManager = new ResourceManager("MMD_Morph_NoteHelp.LanguageList.Resource", typeof(OptionWin).Assembly);

        // 构造函数，传入主窗体引用
        public OptionWin(MainForm mainForm)
        {
            InitializeComponent();
            this.mainForm = mainForm; // 传入主窗体引用
            this.TopMost = true; // 保证所有弹出层都在最前，因为语言下拉表和颜色选择器被窗口挡住，需要把它们放到前面。

            //this.Mode = AntdUI.TAMode.Light; // 默认浅色主题

            // 主题变更事件订阅
            // ThemeManager.OnThemeChanged += UpdateForThemeChange;
            ThemeManager.OnThemeChanged += ApplyThemeColors; 

            // 订阅语言变更事件
            LanguageManager.OnLanguageChanged += UpdateLanguage;
            // 立即应用当前语言（确保窗口显示时就是正确的语言）
            ApplyLocalization();

            // 1. 填充语言列表项
            LanguageList.List = true; // 启用列表模式
            LanguageList.ReadOnly = false; // 只读模式关闭，允许选择
            LanguageList.Enabled = true; // 启用控件
            LanguageList.Items.Clear();
            LanguageList.Items.AddRange(new object[] {
                    "English",
                    "简体中文",
                    "繁體中文",
                    "日本語"
                });

            // 2. 读取配置并设置选中项
            // 必须放到 OptionWin(MainForm mainForm) 这里，否则会出现同名下拉表无法解决，放到这里可解决问题。
            string savedLang = ini.Read("Window", "Language", "en");
            string[] cultureNames = { "en", "zh-CN", "zh-TW", "ja-JP" };
            int idx = Array.IndexOf(cultureNames, savedLang);

            // 如果找不到配置的语言或索引无效，则默认使用第一项（英文）
            if (idx < 0 || idx >= LanguageList.Items.Count)
            {
                idx = 0; // 默认英文
            }

            LanguageList.SelectedValue = LanguageList.Items[idx]; // 通过 SelectedValue 设置当前选中项，实时显示在语言控件上
        }

        // 窗体加载
        private void OptionWin_Load(object sender, EventArgs e)
        {
            // 链接 ResourceManager 语言文件
            ResourceManager rm = new ResourceManager("MMD_Morph_NoteHelp.LanguageList.Resource", Assembly.GetExecutingAssembly());

            // 在程序启动或窗口加载时调用配置
            //LoadConfig();

            // 读取并应用主题状态
            UpdateThemeButtonAppearance(ThemeManager.IsDark);

            // 应用当前语言到界面
            ApplyLocalization();

            // 读取并应用其他配置
            string fontFamily = ini.Read("Font", "FontFmaily", ""); // 字体名称
            float fontSize = float.TryParse(ini.Read("Font", "FontSize", ""), out float fs) ? fs : 9f; // 字体大小
            string fontColor = ini.Read("Font", "FontColor", "#000000"); // 字体颜色
            int fontAlpha = int.TryParse(ini.Read("Font", "FontOpacity", "255"), out int fa) ? fa : 255; // 字体透明度
        }

        // 为了避免UI渲染BUG，我们依然在Shown事件里设置语言列表的选中值
        private void OptionWin_Shown(object sender, EventArgs e)
        {
            string savedLang = ini.Read("Window", "Language", "en");
            string[] cultureNames = { "en", "zh-CN", "zh-TW", "ja-JP" };
            int idx = Array.IndexOf(cultureNames, savedLang);
            if (idx < 0 || idx >= LanguageList.Items.Count) idx = 0;
            LanguageList.SelectedValue = LanguageList.Items[idx];

            // 根据当前主题应用颜色
            ApplyThemeColors(ThemeManager.IsDark);
        }

        // 应用主题颜色
        public void ApplyThemeColors(bool isDark)
        {
            this.Mode = isDark ? AntdUI.TAMode.Dark : AntdUI.TAMode.Light;
            UpdateThemeButtonAppearance(isDark); // 更新暗色主题

            if (isDark) // 深色模式
            {
                this.BackColor = Color.FromArgb(48, 48, 48); // 设置窗口背景色
                SettingsHeader.BackColor = Color.FromArgb(48, 48, 48); // 设置标题栏背景色
                SettingsHeader.ForeColor = Color.White; // 设置标题栏文字颜色
                LightDarktext.ForeColor = Color.White; // 设置浅色深色文字颜色
                ThemeLDOPEN.BackColor = Color.FromArgb(48, 48, 48); // 主题按钮背景色
                ThemeLDOPEN.ForeColor = Color.White; // 主题按钮文字颜色
                WinColorChange.BackColor = Color.FromArgb(48, 48, 48); // 窗口颜色选择器背景色
                WinColorText.ForeColor = Color.White; // 窗口文字颜色
                FontColorText.ForeColor = Color.White; // 字体文字颜色
                FontWinChange.BackColor = Color.FromArgb(48, 48, 48); // 字体按钮背景色
                FontWinChange.ForeColor = Color.White; // 字体按钮文字颜色
                FontColorChange.BackColor = Color.FromArgb(48, 48, 48); // 字体颜色选择器颜色
                LanguageText.ForeColor = Color.White; // 语言文字颜色
                LanguageList.BackColor = Color.FromArgb(48, 48, 48); // 设置语言下拉背景色
                LanguageList.ForeColor = Color.White; // 设置语言下拉文字颜色
            }
            else // 浅色模式
            {
                this.BackColor = SystemColors.Control; // 设置窗口背景色
                SettingsHeader.BackColor = SystemColors.Window; // 设置标题栏背景色
                SettingsHeader.ForeColor = SystemColors.WindowText; // 设置标题栏文字颜色
                LightDarktext.ForeColor = SystemColors.WindowText; // 设置浅色深色文字颜色
                ThemeLDOPEN.BackColor = SystemColors.Window; // 主题按钮背景色
                ThemeLDOPEN.ForeColor = SystemColors.WindowText; // 主题按钮文字颜色
                WinColorChange.ForeColor = SystemColors.WindowText; // 窗口颜色选择器文字颜色
                WinColorText.ForeColor = SystemColors.WindowText; // 窗口文字颜色
                FontColorText.ForeColor = SystemColors.WindowText; // 字体文字颜色
                FontWinChange.BackColor = SystemColors.Window; // 字体按钮背景色
                FontWinChange.ForeColor = SystemColors.WindowText; // 字体按钮文字颜色
                FontColorChange.BorderColor = SystemColors.Window; // 字体颜色选择器颜色
                LanguageText.ForeColor = SystemColors.WindowText; // 语言文字颜色
                LanguageList.BackColor = SystemColors.Window; // 设置语言下拉背景色
                LanguageList.ForeColor = SystemColors.WindowText; // 设置语言下拉文字颜色
            }
            this.Refresh(); // 刷新以应用颜色
        }

        // 主题变更时调用
        private void UpdateForThemeChange(bool isDark)
        {
            UpdateThemeButtonAppearance(isDark);
        }

        /// <summary>
        /// 根据当前的主题状态，更新按钮的外观
        /// </summary>
        private void UpdateThemeButtonAppearance(bool isDarkNow)
        {
            if (isDarkNow)
            {
                ThemeLDOPEN.IconSvg = "MoonOutlined"; // 夜间图标
                ThemeLDOPEN.ForeColor = Color.White;      // 图标颜色
                ThemeLDOPEN.DefaultBack = Color.Black; // 按钮背景
            }
            else
            {
                ThemeLDOPEN.IconSvg = "SunOutlined"; // 日间图标
                ThemeLDOPEN.ForeColor = Color.Black;      // 图标颜色
                ThemeLDOPEN.DefaultBack = Color.White; // 按钮背景
            }
        }

        //// 主题切换事件
        //// BUG:开关无法固定
        //private void themeswitch_CheckedChanged(object sender, BoolEventArgs e)
        //{
        //    AntdUI.Config.IsDark = e.Value; // 更新全局主题状态

        //    if (mainForm != null)
        //    {
        //        // 调用主窗体的主题应用方法
        //        mainForm.ApplyThemeColors(e.Value);
        //    }

        //    // 保存开关状态到配置文件
        //    ini.Write("Window", "IsDark", e.Value.ToString().ToLower());
        //    mainForm.SaveConfig();
        //}


        // 主题色开关按钮
        private void ThemeLDOPEN_Click(object sender, EventArgs e)
        {
            bool newThemeIsDark = !ThemeManager.IsDark; // 切换主题状态
            ThemeManager.SetTheme(newThemeIsDark); // 更新主题

            // 保存开关状态到配置文件
            ini.Write("Window", "IsDark", newThemeIsDark.ToString().ToLower());
            mainForm.SaveConfig();
        }

        // 窗口颜色调节
        private void WinColorChange_ValueChanged(object sender, ColorEventArgs e)
        {
            if (mainForm != null)
            {
                mainForm.BackColor = Color.FromArgb(mainForm.BackColor.A, e.Value); // 只改颜色
                mainForm.Opacity = e.Value.A / 255.0; // 设置整体透明度。假设 e.Value.A 范围为 0-255
            }
            mainForm.SaveConfig(); // 保存颜色和透明度
            //ini.Write("Window", "BackColor", ColorTranslator.ToHtml(e.Value)); // 保存背景色
        }

        // 字体更改
        private void FontWinChange_Click(object sender, EventArgs e)
        {
            using (FontDialog fontDialog = new FontDialog())
            {
                if (fontDialog.ShowDialog() == DialogResult.OK && mainForm != null)
                {
                    mainForm.Font = fontDialog.Font; // 设置主窗体字体
                    mainForm.ChoiceDisplay.Font = fontDialog.Font; // 设置选择显示字体
                    mainForm.ValueSize.Font = fontDialog.Font; // 设置数值大小字体
                    mainForm.NoteContent.Font = fontDialog.Font; // 设置备注内容字体
                }
            }
            mainForm.SaveConfig(); // 选择字体后保存
            //ini.Write("Font", "FontFmaily", this.Font.FontFamily.Name); // 保存字体
        }

        // 字体颜色更改
        private void FontColorChange_ValueChanged(object sender, ColorEventArgs e)
        {
            if (mainForm != null)
            {
                mainForm.ForeColor = e.Value; // 设置主窗体字体颜色
                mainForm.ChoiceDisplay.ForeColor = e.Value; // 设置选择显示字体颜色
                mainForm.ValueSize.ForeColor = e.Value; // 设置数值大小字体颜色
                mainForm.NoteContent.ForeColor = e.Value; // 设置备注内容字体颜色
            }
            mainForm.SaveConfig(); // 保存字体颜色
            //ini.Write("Font", "FontColor", ColorTranslator.ToHtml(e.Value)); // 保存字体颜色
            //ini.Write("Font", "FontOpacity", e.Value.A.ToString()); // 保存字体透明度
        }

        // 多语言
        public void ApplyLocalization()
        {
            // 直接使用当前线程的文化信息，而非固定的 currentCulture
            var currentCulture = Thread.CurrentThread.CurrentUICulture;
            this.Text = resManager.GetString("MainForm_Title", currentCulture); // 主窗口标题
            LightDarktext.Text = resManager.GetString("LightDarktext_Translation", currentCulture); // 浅色/深色主题文本
            WinColorText.Text = resManager.GetString("WinColorText_Translation", currentCulture); // 窗口颜色文本
            FontColorText.Text = resManager.GetString("FontColorText_Translation", currentCulture); // 字体颜色文本
            LanguageText.Text = resManager.GetString("LanguageText_Translation", currentCulture); // 语言选择文本
            SettingsHeader.Text = resManager.GetString("Settings_Title", currentCulture); // 设置标题
        }

        // 语言选择事件中确保配置保存后立即刷新
        private void LanguageList_SelectedIndexChanged(object sender, IntEventArgs e)
        {
            string[] culturesNames = { "en", "zh-CN", "zh-TW", "ja-JP" };
            string selectedCulture = culturesNames[e.Value];

            // 更新线程文化并保存配置
            Thread.CurrentThread.CurrentUICulture = new CultureInfo(selectedCulture);
            LanguageManager.SetLanguage(selectedCulture); // 触发全局语言更新
            ini.Write("Window", "Language", selectedCulture); // 保存到配置
            mainForm.SaveConfig(); // 确保配置立即保存
            ApplyLocalization(); // 强制当前窗口立即更新语言
        }

        // 设置窗口自身的语言更新方法
        private void UpdateLanguage()
        {
            ApplyLocalization(); // 复用现有方法更新控件文字
        }

        // 窗口关闭时取消订阅
        protected override void OnClosed(EventArgs e)
        {
            base.OnClosed(e);
            LanguageManager.OnLanguageChanged -= UpdateLanguage; // 取消订阅语言变更事件
            ThemeManager.OnThemeChanged -= ApplyThemeColors; // 取消订阅主题变更事件
        }



        // =========== END ===========
    }
}
